home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / reuse.lha / reuse / c / DynArray.c next >
C/C++ Source or Header  |  1992-08-18  |  3KB  |  105 lines

  1. /* $Id: DynArray.c,v 1.6 1992/08/17 11:42:24 grosch rel $ */
  2.  
  3. /* $Log: DynArray.c,v $
  4.  * Revision 1.6  1992/08/17  11:42:24  grosch
  5.  * added error message if out of memory
  6.  *
  7.  * Revision 1.5  1992/05/05  13:19:05  grosch
  8.  * added rcsid
  9.  *
  10.  * Revision 1.4  1991/11/21  14:28:16  grosch
  11.  * new version of RCS on SPARC
  12.  *
  13.  * Revision 1.3  90/09/04  17:32:07  grosch
  14.  * automatic determination of alignment
  15.  * 
  16.  * Revision 1.2  90/07/04  14:33:51  grosch
  17.  * introduced conditional include
  18.  * 
  19.  * Revision 1.1  88/10/18  17:32:05  grosch
  20.  * fixed bug: invariant must hold: ElmtCount * AlignedSize (ElmtSize) % 4 == 0
  21.  * 
  22.  * Revision 1.0  88/10/04  11:44:35  grosch
  23.  * Initial revision
  24.  * 
  25.  */
  26.  
  27. /* Ich, Doktor Josef Grosch, Informatiker, Sept. 1987 */
  28.  
  29. static char rcsid [] = "$Id: DynArray.c,v 1.6 1992/08/17 11:42:24 grosch rel $";
  30.  
  31. # include "ratc.h"
  32. # include "DynArray.h"
  33. # include <stdio.h>
  34. # include "General.h"
  35. # include "Memory.h"
  36.  
  37. /* INVARIANT ElmtCount * AlignedSize (ElmtSize) % sizeof (long) == 0 */
  38.  
  39. static unsigned long AlignedSize (ElmtSize)
  40.    unsigned long    ElmtSize;
  41.    {
  42.       register unsigned long Align;
  43.  
  44.       if (ElmtSize >= yyMaxAlign) {
  45.      Align = yyMaxAlign;
  46.       } else {
  47.      Align = Exp2 (Log2 (ElmtSize + ElmtSize - 2));
  48.       }
  49.       return ElmtSize + Align - 1 - (ElmtSize - 1) % Align;
  50.    }
  51.  
  52. void MakeArray (ArrayPtr, ElmtCount, ElmtSize)
  53.    char * *    ArrayPtr    ;
  54.    unsigned long * ElmtCount    ;
  55.    unsigned long ElmtSize    ;
  56.    {
  57.       ElmtSize = AlignedSize (ElmtSize);
  58.       switch (ElmtSize % 4) {
  59.       case 0: break;
  60.       case 2: if (* ElmtCount & 1) (* ElmtCount) ++; break;
  61.       case 1:
  62.       case 3: * ElmtCount += sizeof (long) - 1 - (* ElmtCount - 1) % sizeof (long); break;
  63.       }
  64.       * ArrayPtr = Alloc (* ElmtCount * ElmtSize);
  65.       if (* ArrayPtr == NULL) (void) fprintf (stderr, "MakeArray: out of memory\n");
  66.    }
  67.  
  68. void ExtendArray (ArrayPtr, ElmtCount, ElmtSize)
  69.    char * *    ArrayPtr    ;
  70.    unsigned long * ElmtCount    ;
  71.    unsigned long ElmtSize    ;
  72.    {
  73.               char *    NewPtr    ;
  74.       register    long *    Source    ;
  75.       register    long *    Target    ;
  76.       register    long    i         ;
  77.  
  78.       ElmtSize = AlignedSize (ElmtSize);
  79.       NewPtr = Alloc (* ElmtCount * ElmtSize * 2);
  80.       Source = (long *) * ArrayPtr;
  81.       Target = (long *) NewPtr;
  82.       i      = * ElmtCount * ElmtSize / sizeof (long);
  83.  
  84.       if (NewPtr == NULL)
  85.      (void) fprintf (stderr, "ExtendArray: out of memory\n");
  86.       else {
  87.      do {
  88.         * Target ++ = * Source ++;
  89.      } while (i -- > 0);
  90.  
  91.      Free (* ElmtCount * ElmtSize, * ArrayPtr);
  92.      * ElmtCount += * ElmtCount;
  93.       }
  94.       * ArrayPtr = NewPtr;
  95.    }
  96.  
  97. void ReleaseArray (ArrayPtr, ElmtCount, ElmtSize)
  98.    char * *    ArrayPtr    ;
  99.    unsigned long * ElmtCount    ;
  100.    unsigned long ElmtSize    ;
  101.    {
  102.       ElmtSize = AlignedSize (ElmtSize);
  103.       Free (* ElmtCount * ElmtSize, * ArrayPtr);
  104.    }
  105.